/*
 * sortieFichier.c
 *
 *  Created on: 3 janv. 2012
 *      Author: arthur
 */

#include "sortieFichier.h"

int ecritureDansUnFichier(char * nomFichier, code4adresses * code) {
	FILE * fichier = fopen(nomFichier, "w+");
	enteteMIPS(fichier);

	code4adresses * instructionCourante = code;
	while (instructionCourante != 0) {
		if (instructionCourante->instruction == liChaine) {
			fprintf(fichier, "\tla %s, %s\n", nomReg(instructionCourante->arg1),
					instructionCourante->label);
		} else {


			//Vérification de la présence d'un label à écrire en debut de ligne
			if (instructionCourante->label != NULL && strlen(
					instructionCourante->label) && !estUnSaut(
					instructionCourante->instruction)) {
				fprintf(fichier, "%s:\t", instructionCourante->label);
			} else {
				fprintf(fichier, "\t");
			}
			//écriture du nom de l'instruction
			fprintf(fichier, "%s", nomInstr(instructionCourante->instruction));

			//écriture des arguments

			switch (nbArg(instructionCourante->instruction)) {
			case 3:
				//arg1
				if (instructionCourante->typeArgs % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, " %s", nomReg(instructionCourante->arg1));
				} else {
					fprintf(fichier, " 0x%x", instructionCourante->arg1);
				}
				//arg2
				if ((instructionCourante->typeArgs >> 1) % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, ", %s", nomReg(instructionCourante->arg2));
				} else {
					fprintf(fichier, ", 0x%x", instructionCourante->arg2);
				}
				//arg3
				if ((instructionCourante->typeArgs >> 2) % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, ", %s", nomReg(instructionCourante->arg3));
				} else {
					fprintf(fichier, ", 0x%x", instructionCourante->arg3);
				}
				break;
			case 2:
				//arg1
				if (instructionCourante->typeArgs % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, " %s", nomReg(instructionCourante->arg1));
				} else {
					fprintf(fichier, " 0x%x", instructionCourante->arg1);
				}
				//arg2
				if ((instructionCourante->typeArgs >> 1) % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, ", %s", nomReg(instructionCourante->arg2));
				} else {
					fprintf(fichier, ", 0x%x", instructionCourante->arg2);
				}
				break;
			case 1:
				//arg1
				if (instructionCourante->typeArgs % 2) {
					//l'argument 1 est un registre
					fprintf(fichier, " %s", nomReg(instructionCourante->arg1));
				} else {
					fprintf(fichier, " 0x%x", instructionCourante->arg1);
				}
				break;
			default:
				break;
			}

			//Vérification de la présence d'un label à écrire en fin de ligne
			if (estUnSaut(instructionCourante->instruction)
					&& instructionCourante->label != NULL && strlen(
					instructionCourante->label)) {
				//vérification de la necessité d'une virgule
				if (nbArg(instructionCourante->instruction) > 0) {
					fprintf(fichier, ",");
				}
				fprintf(fichier, " %s", instructionCourante->label);
			}

			fprintf(fichier, "\n");
		}

		instructionCourante = instructionCourante->suivant;
	}

	sortiePropre(fichier);

	fclose(fichier);

	return 0;
}

void enteteMIPS(FILE * fichier) {
	//	memcpy(fichier, data, sizeof(data));
	fprintf(fichier, "%s", data);
	fprintf(fichier, "\t.text\n");
}
void sortiePropre(FILE * fichier) {
	fprintf(fichier,
			"\tli $v0 10\n\tsyscall\n");
}
